/*
 * 功能：多线程下载类
 */
package download;

import java.util.Set;

import parse.HtmlParserTool;

import filter.DownloadFilter;
import filter.LinkFilter;
import filter.UrlFilter;
import frontier.LinkQueue;


public class DownLoadThread implements Runnable {

	public Thread thrd;
	LinkQueue linkQueue;
	LinkFilter filter;
	public DownLoadThread(String name, LinkQueue lQueue) {

		thrd = new Thread(this, name);
		linkQueue = lQueue;
		 filter= new DownloadFilter();//放在这里，只初始化一次，防止多次读取文件
	}

	/**
	 * 下载网页
	 */
	public void crawling() { // 定义过滤器
	
		

		int count = 0;// 统计队为空的次数，当尝试5次都为空时，每次等2秒，退出该线程

		while (true) {
			// 队头URL出队列
			String visitUrl = (String) linkQueue.unVisitedUrlDeQueue();

			if (visitUrl == null) {
				if (count >= 5) {
					System.out.println(thrd.getName() + ":线程退出");
					return;
				} else {
					try {
						count++;
						System.out.println(thrd.getName() + "队列为空，线程正在第"
								+ count + "次重试...");
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						System.out.println("interrupt");
					}

					continue;
				}

			}

		
			DownLoadFile downLoader = new DownLoadFile();
			
			//System.out.println("待访问队列url数："+linkQueue.getUnvisitedUrlSize());
			System.out.println(thrd.getName() + "开始下载页面：" + visitUrl);
			// 下载网页
			String webContent = downLoader.downloadFile(visitUrl);
			if (webContent != null && webContent != "") {
				
				// 该 url 放入到已访问的 URL 中
				linkQueue.addVisitedUrl(visitUrl);
				// 提取出下载网页中的 URL

				System.out.println(thrd.getName() + "完成页面下载： " + visitUrl);
				Set<String> links = HtmlParserTool
						.extracLinks(visitUrl, filter);
				// 新的未访问的 URL 入队
				for (String link : links) {
					linkQueue.addUnvisitedUrl(link);
				}
			}
			else 
			{
				//System.out.println(thrd.getName() + "页面下载失败： " + visitUrl);
			}
		}
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		crawling();// 下载
	}
}
